package concurrency.multithreading;

import com.sun.org.glassfish.gmbal.ManagedObject;

import java.util.concurrent.Semaphore;

/**
 * @author xiaoming
 * @version 1.0
 * @date 2019-03-12 22:03
 * 假设某机场的海关通道共有3个窗口, 一批需要出关的人排成长队，每个
 * 人都是一个结程。当3个窗口中的任意一个出现空闲时，工作人员指示队列中第一个
 * 人出队到该空闲窗口接受查验。对
 **/
public class CustomCheckWindow {
    public static void main(String[] args) {
        // 设置3个信号量(3个服务窗口)
        Semaphore semaphore = new Semaphore(3);

        // 这个队伍排了5个人
        for (int i = 1; i <= 5; i++) {
            new SecurityCheckThread(i, semaphore).start();

        }
    }

    private static class SecurityCheckThread extends Thread {
        private int seq;
        private Semaphore semaphore;

        public SecurityCheckThread(int seq, Semaphore semaphore) {
            this.seq = seq;
            this.semaphore = semaphore;
        }

        @Override
        public void run() {
            try {
                semaphore.acquire();
                System.out.println("NO." + seq + "乘客, 正在查验中...");
                // 假设号码是整数除2的人是可疑人员, 需要花更长时间来安检
                if (seq % 2 == 0) {
                    Thread.sleep(10000);
                    System.out.println("NO." + seq + "乘客身份可疑, 不能出国");
                }

            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release();
                System.out.println("NO." + seq + "乘客已完成服务");
            }
        }
    }
}
